package com.test.vue.utils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

/**
 * 路径工具集
 *
 */
public class PathUtil
{

    /**
     * 获得日期目录
     * 
     * @return
     */
    public final static String getDatePath() {
        Date date = new Date();
        String path = new SimpleDateFormat( "yyyy/MM/dd" ).format( date );

        File f = new File( path );
        if( !f.exists() )
            f.mkdirs();

        return path;
    }

    /**
     * 获得日期目录
     * 
     * @param path
     * @return
     */
    public final static String getDatePath( String path ) {
        Date date = new Date();
        path += "/" + new SimpleDateFormat( "yyyy/MM/dd" ).format( date );

        File f = new File( path );
        if( !f.exists() )
            f.mkdirs();

        return path;
    }

    /**
     * 从给定文件路径提取文件夹路径。
     *
     * @param filePath 给定的文件路径。
     * @return 文件夹路径。
     */
    public final static String getFolder( String filePath ) {
        File file = new File( filePath );
        String result =
                filePath.substring( 0, filePath.length() - file.getName().length() - 1 );
        // result = PathUtil.unifyPath( result );

        return result;
    }

    /**
     * 转换给定路径为一致的路径表示方式。
     *
     * @param path 给定的路径。
     * @return 统一的路径表示方式。
     */
    public final static String unifyPath( String path ) {
        String result = "";

        if( !path.trim().isEmpty() ) {
            result = path.replaceAll( "\\", File.separator );
            if( result.charAt( result.length() - 1 ) != '/' ) {
                result += File.separator;
            }
        }

        return result;
    }

    /**
     * 转换给定路径列表中所有路径为一致的路径表示方式。
     *
     * @param pathes 给定的路径列表。
     * @return 统一路径的列表。
     */
    public final static Collection<String> unifyPath( Collection<String> pathes ) {
        Collection<String> list = new ArrayList<String>();

        for( String path : pathes ) {
            list.add( PathUtil.unifyPath( path ) );
        }

        return list;
    }

    /**
     * 检测一个给定路径是否是完整路径。
     *
     * @param path 要被检测的路径。
     * @return 如果是完整路径，返回true，否则返回false。
     */
    public final static boolean IsFullPath( String path ) {
        return path.indexOf( ':' ) != -1;
    }

    /**
     * 合并两个给定的路径。
     *
     * @param filePath1 前路径。
     * @param filePath2 后路径。
     * @return 合并后的路径。
     * @throws Exception filePath2 是一个完整的路径。
     */
    public final static String mergePath( String filePath1, String filePath2 )
            throws Exception {
        if( PathUtil.IsFullPath( filePath2 ) ) {
            throw new Exception( String.format( " %s 是一个完整的路径，无法与 %s 合并", filePath2,
                    filePath1 ) );

        }
        String result = "";

        result = PathUtil.unifyPath( filePath1 );
        result += PathUtil.unifyPath( filePath2 );

        return PathUtil.unifyPath( result );
    }

    /**
     * 从给定路径中，移除一个子路径。
     *
     * @param path 给定的路径。
     * @param subPath 要被移除的子路径。
     * @return 修改后的路径。
     * @throws Exception 子路径没有被包含。
     */
    public final static String removeSubPath( String path, String subPath )
            throws Exception {
        String result = "";

        int index = path.indexOf( subPath );
        if( index < 0 )
            throw new Exception( String.format( "子路径：%s 没有被路径: %s 包含！", subPath, path ) );

        result = path.substring( index, index + subPath.length() );

        return result;
    }

    /**
     * 检测指定目录是否存在。
     *
     * @param strPath 目录所在绝对路径。
     * @return 如果指定目录存在则返回true，否则返回false。
     */
    public final static boolean existsPath( String strPath ) {
        File file = new File( strPath );
        return file.exists();
    }

    /**
     * 从磁盘删除指定路径的目录
     *
     * @param strPath 目录所在绝对路径
     * @return 是否成功
     */
    public final static boolean deletePath( String strPath ) {
        File file = new File( strPath );
        return file.delete();
    }

    /**
     * 创建指定路径，包括所有必需但不存在的父目录。
     *
     * @param strPath 路径
     * @return
     */
    public final static boolean createPath( String strPath ) {
        File file = new File( strPath );
        return file.mkdirs();
    }

    /**
     * 从给定文件路径提取文件名称。
     *
     * @param filePath 给定的文件路径
     * @return
     */
    public final static String getFileName( String filePath ) {
        File file = new File( filePath );
        return file.getName();
    }

    /**
     * 获取文件的扩展名
     *
     * @param filename 文件名称
     * @return
     */
    public final static String getExtensionName( String filename ) {
        if( ( filename != null ) && ( filename.length() > 0 ) ) {
            int dot = filename.lastIndexOf( '.' );
            if( ( dot > -1 ) && ( dot < ( filename.length() - 1 ) ) ) {
                return filename.substring( dot + 1 );
            }
        }
        return filename;
    }

    /**
     * 获取无扩展名的文件名称
     *
     * @param filename 文件名称
     * @return
     */
    public final static String getNameNoEx( String filename ) {
        if( ( filename != null ) && ( filename.length() > 0 ) ) {
            int dot = filename.lastIndexOf( '.' );
            if( ( dot > -1 ) && ( dot < ( filename.length() ) ) ) {
                return filename.substring( 0, dot );
            }
        }
        return filename;
    }
}
